
#include "lexer.h"
#include "error.h"
#include "table.h"
#include "parser.h"
#include <string>
#include <map>
#include <iostream>
using namespace std;
using namespace Error;
using namespace Lexer;
using namespace Table;
using namespace Parser;

double Parser::expr(bool get,istream& in)		//表达式分析开始以及处理'+'、'-'运算（符）
{
	double left_ans = term(get,in);		//left_ans表示'+'、'-'的左边结果 

	while (1) {  						//无穷循环 
		switch (curr_tok) {
		case PLUS:
			left_ans += term(true, in);//调用term()得到'+'的右边结果，'+'运算后结果保存在left_ans中 
			break;
		case MINUS:
			left_ans -= term(true, in);
			break;
		default:
			return left_ans;
		}
	}
}

double Parser::term(bool get,istream& in){		//处理'*'、'/'运算（符）

	double left_ans = prim(get, in);		//left_ans表示'*'、'/'的左边结果 

	for (;;)
		switch (curr_tok) {
		case MUL:
			left_ans *= prim(true, in);//调用term()得到'*'的右边结果，'*'运算后结果保存在left_ans中
			break;
		case DIV:				//除数不能为0 
			if (double d = prim(true, in)) {
				left_ans /= d;
				break;
			}
			return Error::error("divide by 0");
		default:
			return left_ans;
		}
}

double Parser::prim(bool get,istream& in) //处理表达式中的基本项,如：25,pi,x,-25,-pi,-x,(pi*2+3.5) 
{
	if (get) get_token(in);	//调用get_token()获取一个记号（符号）给curr_tok 

	switch (curr_tok) {
	case NUMBER: {		//浮点数常量  
		double v = Lexer::number_value;
		get_token(in);
		return v;
	}
	case NAME: {		//命名常量或变量的名字 
		double& v = table[Lexer::string_value];  //已定义的命名常量 
		if (get_token(in) == Lexer::ASSIGN)		//名字后跟赋值运算符，是变量名 
			v = expr(true,in); 			//获得变量的值(也是一个表达式)
		return v;
	}
	case MINUS: {		//取负
		return -prim(true,in);
	}
	case LP: {		//左括号 
		double tmp = expr(true,in);
		if (curr_tok != RP) return error(") expected");
		get_token(in);  //扔掉')'
		return tmp;
	}
	default:
		return Error::error("primary expected");
	}
}


